﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CTEM.Controllers.BUS;
using CTEM.Models;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Ribbon;
using CTEM.Controllers.Global;
using DevExpress.XtraEditors;

namespace CTEM.ModuleForms.CommonForm
{
    public partial class RoleManagement : RibbonForm
    {
        readonly RoleBUS _roleBus = new RoleBUS();
        List<RoleDTO> _listRole = new List<RoleDTO>();
        List<RoleDTO> _listRoleHistory = new List<RoleDTO>();

        public RoleManagement()
        {
            InitializeComponent();
            LoadRole();            
        }

        private void LoadRole()
        {
            _listRole = _roleBus.GetWithoutAdmin();
            roleDTOBindingSource.DataSource = _listRole;
        }

        private static bool RoleDTOValidateForNew(List<RoleDTO> listRole, string roleName, long roleID)
        {
            
            foreach (var roleDto in listRole)
            {
                if (roleDto.RoleName.ToUpper().Trim().Equals(roleName.ToUpper().Trim()) && roleDto.RoleID.CompareTo(roleID) == 0)
                    return true;
                if (roleDto.RoleName.ToUpper().Trim().Equals(roleName.ToUpper().Trim()))
                    return false;
            }
            return true;
        }

        private void gridView1_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            var newRole = e.Row as RoleDTO;
            if (newRole != null)
            {
                if (newRole.RoleName == null)
                {
                     LoadRole();
                     return;
                }
                
                if (RoleDTOValidateForNew(_listRole, newRole.RoleName, newRole.RoleID))
                {
                    if (newRole.Description == null) newRole.Description = "";

                    if (newRole.RoleID == 0)
                    {
                        long success = _roleBus.AddRole(newRole);
                        if (success != 0)
                        {
                            newRole.RoleID = success;
                            newRole.Status = 1;
                            _listRoleHistory.Add(newRole);
                            LoadRole();
                        }
                    }
                        
                    else
                    {
                        if (newRole.RoleName == Constants.EMPTY_TEXT)
                        {
                            XtraMessageBox.Show("Tên Chức Vụ không thể bỏ trống", "Cảnh báo", MessageBoxButtons.OK,
                                                                            MessageBoxIcon.Warning);
                            LoadRole();
                            return;
                        }
                        var oldRole = _roleBus.GetRoleByID(newRole.RoleID);
                        bool success = _roleBus.EditRole(newRole);
                        if (success)
                        {
                            newRole = oldRole;
                            newRole.Status = 2;
                            _listRoleHistory.Add(newRole);
                            LoadRole();
                        }
                    }
                }
                else
                {
                    XtraMessageBox.Show(string.Format("Chức vụ \"{0}\" mà bạn khởi tạo đã tồn tại.\nVui lòng thử lại với chức vụ khác.", newRole.RoleName), "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    LoadRole();
                }
                
            }
        }

        private void barBtn_Delete_ItemClick(object sender, ItemClickEventArgs e)
        {
            int rowIndex = gdvRole.FocusedRowHandle;
            var role = gdvRole.GetRow(rowIndex) as RoleDTO;
            if (role != null)
            {
                if (XtraMessageBox.Show(string.Format("Bạn có chắc chắn muốn xóa chức vụ \"{0}\" không?", role.RoleName), "Cảnh báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    bool success = _roleBus.DeleteRole(role.RoleID);
                    if (success)
                    {
                        LoadRole();
                        role.Status = 3;
                        _listRoleHistory.Add(role);
                    }
                    else
                    {
                        XtraMessageBox.Show("Bạn phải xóa những nhân viên đang giữ chức vụ này trước.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
            }
        }

        private void barBtn_SetRights_ItemClick(object sender, ItemClickEventArgs e)
        {
            using (var setRightForm = new DXSetRight(_listRole))
            {
                setRightForm.ShowDialog();
            }
        }

        private void barBtn_Undo_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (_listRoleHistory.Count <= 0) return;
            var undoItem = _listRoleHistory[_listRoleHistory.Count - 1];
            switch (undoItem.Status)
            {
                case 1:
                    foreach (var role in _listRole)
                        if (undoItem.RoleID == role.RoleID)
                        {
                            _roleBus.DeleteRole(role.RoleID);
                            _listRoleHistory.RemoveAt(_listRoleHistory.Count - 1);
                            LoadRole();
                            break;
                        }
                    break;
                case 2:
                    foreach (var role in _listRole)
                        if (undoItem.RoleID == role.RoleID)
                        {
                            _roleBus.EditRole(undoItem);
                            _listRoleHistory.RemoveAt(_listRoleHistory.Count - 1);
                            LoadRole();
                            break;
                        }
                    break;
                case 3:
                            _roleBus.AddRole(undoItem);
                            _listRoleHistory.RemoveAt(_listRoleHistory.Count - 1);
                            LoadRole();
                            break;
                default:
                    break;
            }
        }
    }
}